承上文 在 C# 中 Nullable Reference Types 使用屬性NotNullIfNotNull
我們繼續探討...
假設一個例子
class Person
{
  private string _name;
  public Person()
  {
    SetDefaultName();
  }
  private void SetDefaultName()
  {
    _name = "Bob";
  }
}
這段程式碼定義了一個名為 Person 的類別,裡面有一個私有欄位叫做 _name,以及一個私有函式叫做 SetDefaultName。
類別裡還有一個無參數的建構子,裡面呼叫了 SetDefaultName 函式。SetDefaultName 函式將 _name 這個欄位初始化為 "Bob"。
編譯器將對上面的程式碼發出警告:
警告訊息如下:
警告	CS8618	退出建構函式時,不可為 Null 的 欄位 '_name' 必須包含非 Null 值。請考慮將 欄位 宣告為可為 Null。
我們可以考慮把宣告欄位_name改為可空'?',但是,明明建構子內就有呼叫 SetDefaultName 函式來初始化類_name欄位,這意味著編譯器的訊息是錯誤的。
所以在這種情況下,與其把宣告欄位 _name 改為可空 '?',但你並不希望該欄位可空,更適合的作法應該是加入屬性 MemberNotNull 來解決這個問題:
[MemberNotNull(nameof(_name))]
private void SetDefaultName()
這是什麽意思呢?
[MemberNotNull(nameof(_name))] 屬性是給編譯器使用的,主要是讓編譯器更瞭解代碼的邏輯。
如果你使用了 [MemberNotNull(nameof(_name))] 屬性,
那麼編譯器就會知道在 SetDefaultName 方法中初始化的 _name 將不會是 null,因此它將不再發出警告。
了解更多:MemberNotNullAttribute Class
下一篇
在 C# 中 Nullable Reference Types 使用屬性MemberNotNullWhen